#ifndef __INF_CPS121_H__
#define __INF_CPS121_H__

#include "Common_Config.h"
#include "Common_Debug.h"
#include "Driver_I2C.h"
#include "FreeRTOS.h"
#include "task.h"

#define CPS121_BASE_ADDR  0x6C
#define CPS121_WRITE_ADDR (0x6C << 1)
#define CPS121_READ_ADDR  ((0x6C << 1) + 1) // 之前写成6D了

#define CPS121_MR_REG_ADDR 0x30
#define CPS121_MR_CMD      0x0A

#define CPS121_GD_REG_ADDR 0x06

/* 选择使用的CPS121芯片 */
typedef enum
{
    SENSOR_CPS121_1,

    SENSOR_CPS121_2,

    SENSOR_CPS121_3

} SelCPS121Sensor_t;

/* 气压传感器号 */
typedef enum
{
    AIR_PRESSURE_NUM_BAROMETRIC_PRESSURE = SENSOR_CPS121_1, /* 测量大气压的 */

    AIR_PRESSURE_NUM_LEFT = SENSOR_CPS121_2,                /* 左侧翼压力传感器 */

    AIR_PRESSURE_NUM_RIGHT = SENSOR_CPS121_3                /* 右侧翼压力传感器 */
} AirPressureNum_t;

/**
 * @brief 初始化 CPS121-700
 *
 */
void Inf_CPS121_Init(void);

/**
 * @brief MR指令, 唤醒传感器，并将测量结果存在内部传感器
 *
 * @return Status_t 状态码
 */
Status_t Inf_CPS121_MRCmd(void);

/**
 * @brief 发送GD指令, 获取寄存器中的压力数据
 *
 * @param originalPressure 寄存器中原始的压力数据
 * @return Status_t        状态码
 */
Status_t Inf_CPS121_GDCmd(uint32_t *originalPressure);

/**
 * @brief 将寄存器中原始的压力值转换成真实世界的压力值
 *
 * @param originalPressure  寄存器中原始的压力数据
 * @return uint32_t         转换后真实的压力值(KPa)
 */
uint32_t Inf_CPS121_ConvertRealPressure(uint32_t originalPressure);

/**
 * @brief 选择压力传感器芯片
 *
 * @param sensor SENSOR_CPS121_1、SENSOR_CPS121_2、SENSOR_CPS121_3
 */
void Inf_CPS121_SelectSensor(SelCPS121Sensor_t sensor);

/**
 * @brief 直接读取当前气压的值, 将转换和读取的操作封装在一起
 *
 * @param airPressureNum    气压传感器的编号
 * @return uint32_t         转换后的气压值KPa
 */
uint32_t Inf_CPS121_ReadCurrentPressure(AirPressureNum_t airPressureNum);

#endif
